package frsf.cidisi.exercise.tpidemia.situationCalculus;


import Interfaz.NewJFrame;
import frsf.cidisi.exercise.tpidemia.entidades.Aldea;
import frsf.cidisi.exercise.tpidemia.entidades.Cofre;
import frsf.cidisi.exercise.tpidemia.entidades.Pair;
import frsf.cidisi.exercise.tpidemia.entidades.PairDist;
import frsf.cidisi.exercise.tpidemia.entidades.TipoTesoro;
import frsf.cidisi.faia.state.EnvironmentState;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
/**
 * This class represents the real world state.
 */
public class ArqueologoEstadoEntorno extends EnvironmentState {
	  
	private Aldea aldeaActual;
        private Aldea aldeaFinal;
        private double pesoAcoplado;
        private double valorAcoplado;
        private HashMap<String, Cofre> tesoro;

    public Aldea getAldeaActual() {
        return aldeaActual;
    }

    public void setAldeaActual(Aldea aldeaActual) {
        this.aldeaActual = aldeaActual;
    }

    public Aldea getAldeaFinal() {
        return aldeaFinal;
    }

    public void setAldeaFinal(Aldea aldeaFinal) {
        this.aldeaFinal = aldeaFinal;
    }

   

    public double getPesoAcoplado() {
        return pesoAcoplado;
    }

    public void setPesoAcoplado(double pesoAcoplado) {
        this.pesoAcoplado = pesoAcoplado;
    }

    public double getValorAcoplado() {
        return valorAcoplado;
    }

    public void setValorAcoplado(double valorAcoplado) {
        this.valorAcoplado = valorAcoplado;
    }

        
 
    //private ArrayList
    
    public static final String Aragaey = "aragaey";
    public static final String Ase = "ase";
    public static final String Bresol = "bresol";
    public static final String Bulovoe = "bulovoe";
    public static final String Cabe = "cabe";
    public static final String Cenede = "cenede";
    public static final String Ergintone = "ergintone";
    public static final String Icaedur = "icaedur";
    public static final String Mixocu = "mixocu";
    public static final String Peregaey = "peregaey";
    public static final String Vinizaile = "vinizaile";
    
    public static TipoTesoro moneda = new TipoTesoro("Moneda",100,0.1);
    public static TipoTesoro rubi = new TipoTesoro("Rubi",50,0.02);
    public static TipoTesoro anillo = new TipoTesoro("Anillo",30,0.045);
    public static TipoTesoro diamante = new TipoTesoro("Diamante",90,0.07);
    public static TipoTesoro colgante = new TipoTesoro("Colgante",15,0.02);
    
    
    
    public ArqueologoEstadoEntorno() {
        
    	this.aldeaActual = new Aldea();
        aldeaActual.setNombre(Aragaey);
        this.aldeaFinal = new Aldea();
        aldeaFinal.setNombre(Cenede);
        this.pesoAcoplado = 0;
        this.valorAcoplado = 0;
        this.tesoro = new HashMap<String, Cofre>();
        
         
        this.initState();
    }



	public HashMap<String, Cofre> getTesoro() {
		return tesoro;
	}
	
	public Cofre getTesoro(String aldea) {
		Cofre c = new Cofre();
		c = this.tesoro.get(aldea);
		return c;
	}

	public void setTesoro(HashMap<String, Cofre> tesoro) {
		this.tesoro = tesoro;
	}

	/**
     * This method is used to setup the initial real world.
     */
    @Override
    public void initState() {

    	//Cargar Tesoro
    	//Escenario 1
    	Cofre cErgintone = new Cofre();
    	Pair p1 = new Pair(moneda,300);
    	Pair p2 = new Pair(rubi,400);
    	Pair p3 = new Pair(anillo,280);
    	Pair p4 = new Pair(diamante,80);
    	Pair p5 = new Pair(colgante,150);
    	cErgintone.AgregarTesoro(p1);
    	cErgintone.AgregarTesoro(p2);
    	cErgintone.AgregarTesoro(p3);
    	cErgintone.AgregarTesoro(p4);
    	cErgintone.AgregarTesoro(p5);
    	
    	Cofre cBulovoe = new Cofre();
    	p1 = new Pair(moneda,250);
    	p2 = new Pair(rubi,120);
    	p3 = new Pair(anillo,20);
    	p4 = new Pair(diamante,150);
    	p5 = new Pair(colgante,300);
    	cBulovoe.AgregarTesoro(p1);
    	cBulovoe.AgregarTesoro(p2);
    	cBulovoe.AgregarTesoro(p3);
    	cBulovoe.AgregarTesoro(p4);
    	cBulovoe.AgregarTesoro(p5);
    	
    	Cofre cPeregaey = new Cofre();
    	p1 = new Pair(moneda,100);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,500);
    	p4 = new Pair(diamante,450);
    	p5 = new Pair(colgante,500);
    	cPeregaey.AgregarTesoro(p1);
    	cPeregaey.AgregarTesoro(p2);
    	cPeregaey.AgregarTesoro(p3);
    	cPeregaey.AgregarTesoro(p4);
    	cPeregaey.AgregarTesoro(p5);

    	Cofre cAragaey = new Cofre();
    	p1 = new Pair(moneda,100);
    	p2 = new Pair(rubi,20);
    	p3 = new Pair(anillo,80);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,550);
    	cAragaey.AgregarTesoro(p1);
    	cAragaey.AgregarTesoro(p2);
    	cAragaey.AgregarTesoro(p3);
    	cAragaey.AgregarTesoro(p4);
    	cAragaey.AgregarTesoro(p5);
    	
    	Cofre cIcaedur = new Cofre();
    	p1 = new Pair(moneda,400);
    	p2 = new Pair(rubi,200);
    	p3 = new Pair(anillo,300);
    	p4 = new Pair(diamante,400);
    	p5 = new Pair(colgante,250);
    	cIcaedur.AgregarTesoro(p1);
    	cIcaedur.AgregarTesoro(p2);
    	cIcaedur.AgregarTesoro(p3);
    	cIcaedur.AgregarTesoro(p4);
    	cIcaedur.AgregarTesoro(p5);
    	
    	Cofre cBresol = new Cofre();
    	p1 = new Pair(moneda,80);
    	p2 = new Pair(rubi,80);
    	p3 = new Pair(anillo,70);
    	p4 = new Pair(diamante,20);
    	p5 = new Pair(colgante,200);
    	cBresol.AgregarTesoro(p1);
    	cBresol.AgregarTesoro(p2);
    	cBresol.AgregarTesoro(p3);
    	cBresol.AgregarTesoro(p4);
    	cBresol.AgregarTesoro(p5);
    	
    	Cofre cVinizaile = new Cofre();
    	p1 = new Pair(moneda,50);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,200);
    	p4 = new Pair(diamante,50);
    	p5 = new Pair(colgante,150);
    	cVinizaile.AgregarTesoro(p1);
    	cVinizaile.AgregarTesoro(p2);
    	cVinizaile.AgregarTesoro(p3);
    	cVinizaile.AgregarTesoro(p4);
    	cVinizaile.AgregarTesoro(p5);
    	
    	Cofre cMixocu = new Cofre();
    	p1 = new Pair(moneda,350);
    	p2 = new Pair(rubi,350);
    	p3 = new Pair(anillo,240);
    	p4 = new Pair(diamante,150);
    	p5 = new Pair(colgante,350);
    	cMixocu.AgregarTesoro(p1);
    	cMixocu.AgregarTesoro(p2);
    	cMixocu.AgregarTesoro(p3);
    	cMixocu.AgregarTesoro(p4);
    	cMixocu.AgregarTesoro(p5);
    	
    	Cofre cAse = new Cofre();
    	p1 = new Pair(moneda,20);
    	p2 = new Pair(rubi,50);
    	p3 = new Pair(anillo,70);
    	p4 = new Pair(diamante,100);
    	p5 = new Pair(colgante,60);
    	cAse.AgregarTesoro(p1);
    	cAse.AgregarTesoro(p2);
    	cAse.AgregarTesoro(p3);
    	cAse.AgregarTesoro(p4);
    	cAse.AgregarTesoro(p5);
    	
    	Cofre cCabe = new Cofre();
    	p1 = new Pair(moneda,160);
    	p2 = new Pair(rubi,250);
    	p3 = new Pair(anillo,170);
    	p4 = new Pair(diamante,60);
    	p5 = new Pair(colgante,120);
    	cCabe.AgregarTesoro(p1);
    	cCabe.AgregarTesoro(p2);
    	cCabe.AgregarTesoro(p3);
    	cCabe.AgregarTesoro(p4);
    	cCabe.AgregarTesoro(p5);
    	
    	Cofre cCenede = new Cofre();
    	p1 = new Pair(moneda,160);
    	p2 = new Pair(rubi,250);
    	p3 = new Pair(anillo,170);
    	p4 = new Pair(diamante,60);
    	p5 = new Pair(colgante,120);
    	cCenede.AgregarTesoro(p1);
    	cCenede.AgregarTesoro(p2);
    	cCenede.AgregarTesoro(p3);
    	cCenede.AgregarTesoro(p4);
    	cCenede.AgregarTesoro(p5);

    	//Escenario 2
    	Cofre cErgintone2 = new Cofre();
    	p1 = new Pair(moneda,300);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,50);
    	p4 = new Pair(diamante,100);
    	p5 = new Pair(colgante,80);
    	cErgintone.AgregarTesoro(p1);
    	cErgintone.AgregarTesoro(p2);
    	cErgintone.AgregarTesoro(p3);
    	cErgintone.AgregarTesoro(p4);
    	cErgintone.AgregarTesoro(p5);
    	
    	Cofre cBulovoe2 = new Cofre();
    	p1 = new Pair(moneda,150);
    	p2 = new Pair(rubi,350);
    	p3 = new Pair(anillo,100);
    	p4 = new Pair(diamante,100);
    	p5 = new Pair(colgante,250);
    	cBulovoe.AgregarTesoro(p1);
    	cBulovoe.AgregarTesoro(p2);
    	cBulovoe.AgregarTesoro(p3);
    	cBulovoe.AgregarTesoro(p4);
    	cBulovoe.AgregarTesoro(p5);
    	
    	Cofre cPeregaey2 = new Cofre();
    	p1 = new Pair(moneda,200);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,200);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,400);
    	cPeregaey.AgregarTesoro(p1);
    	cPeregaey.AgregarTesoro(p2);
    	cPeregaey.AgregarTesoro(p3);
    	cPeregaey.AgregarTesoro(p4);
    	cPeregaey.AgregarTesoro(p5);

    	Cofre cAragaey2 = new Cofre();
    	p1 = new Pair(moneda,500);
    	p2 = new Pair(rubi,200);
    	p3 = new Pair(anillo,150);
    	p4 = new Pair(diamante,500);
    	p5 = new Pair(colgante,400);
    	cAragaey.AgregarTesoro(p1);
    	cAragaey.AgregarTesoro(p2);
    	cAragaey.AgregarTesoro(p3);
    	cAragaey.AgregarTesoro(p4);
    	cAragaey.AgregarTesoro(p5);
    	
    	Cofre cIcaedur2 = new Cofre();
    	p1 = new Pair(moneda,50);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,300);
    	p4 = new Pair(diamante,80);
    	p5 = new Pair(colgante,150);
    	cIcaedur.AgregarTesoro(p1);
    	cIcaedur.AgregarTesoro(p2);
    	cIcaedur.AgregarTesoro(p3);
    	cIcaedur.AgregarTesoro(p4);
    	cIcaedur.AgregarTesoro(p5);
    	
    	Cofre cBresol2 = new Cofre();
    	p1 = new Pair(moneda,400);
    	p2 = new Pair(rubi,500);
    	p3 = new Pair(anillo,250);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,550);
    	cBresol.AgregarTesoro(p1);
    	cBresol.AgregarTesoro(p2);
    	cBresol.AgregarTesoro(p3);
    	cBresol.AgregarTesoro(p4);
    	cBresol.AgregarTesoro(p5);
    	
    	Cofre cVinizaile2 = new Cofre();
    	p1 = new Pair(moneda,500);
    	p2 = new Pair(rubi,200);
    	p3 = new Pair(anillo,150);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,250);
    	cVinizaile.AgregarTesoro(p1);
    	cVinizaile.AgregarTesoro(p2);
    	cVinizaile.AgregarTesoro(p3);
    	cVinizaile.AgregarTesoro(p4);
    	cVinizaile.AgregarTesoro(p5);
    	
    	Cofre cMixocu2 = new Cofre();
    	p1 = new Pair(moneda,50);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,300);
    	p4 = new Pair(diamante,500);
    	p5 = new Pair(colgante,250);
    	cMixocu.AgregarTesoro(p1);
    	cMixocu.AgregarTesoro(p2);
    	cMixocu.AgregarTesoro(p3);
    	cMixocu.AgregarTesoro(p4);
    	cMixocu.AgregarTesoro(p5);
    	
    	Cofre cAse2 = new Cofre();
    	p1 = new Pair(moneda,300);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,500);
    	p4 = new Pair(diamante,200);
    	p5 = new Pair(colgante,150);
    	cAse.AgregarTesoro(p1);
    	cAse.AgregarTesoro(p2);
    	cAse.AgregarTesoro(p3);
    	cAse.AgregarTesoro(p4);
    	cAse.AgregarTesoro(p5);
    	
    	Cofre cCabe2 = new Cofre();
    	p1 = new Pair(moneda,250);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,350);
    	p4 = new Pair(diamante,400);
    	p5 = new Pair(colgante,350);
    	cCabe.AgregarTesoro(p1);
    	cCabe.AgregarTesoro(p2);
    	cCabe.AgregarTesoro(p3);
    	cCabe.AgregarTesoro(p4);
    	cCabe.AgregarTesoro(p5);
    	
    	Cofre cCenede2 = new Cofre();
    	p1 = new Pair(moneda,100);
    	p2 = new Pair(rubi,300);
    	p3 = new Pair(anillo,400);
    	p4 = new Pair(diamante,400);
    	p5 = new Pair(colgante,400);
    	cCenede.AgregarTesoro(p1);
    	cCenede.AgregarTesoro(p2);
    	cCenede.AgregarTesoro(p3);
    	cCenede.AgregarTesoro(p4);
    	cCenede.AgregarTesoro(p5);
    	
    	//Para cambiar de escenario solo agergar 2 al nombre de cada coleccion
    	
    	tesoro.put(Ergintone, cErgintone);
    	tesoro.put(Bulovoe, cBulovoe);
    	tesoro.put(Peregaey, cPeregaey);
    	tesoro.put(Aragaey, cAragaey);
    	tesoro.put(Icaedur, cIcaedur);
    	tesoro.put(Bresol, cBresol);
    	tesoro.put(Vinizaile, cVinizaile);
    	tesoro.put(Mixocu, cMixocu);
    	tesoro.put(Ase, cAse);
    	tesoro.put(Cabe, cCabe);
    	tesoro.put(Cenede, cCenede);

    }

    /**
     * String representation of the real world state.
     */

    public String toString() {
        String str = "\n	Emiroce:";
        str+="\n	Posicion Arqueologo: "+this.aldeaActual.getNombre();
        str+="\n	Posicon Pirata: "+this.posicionPirata;
        
        //str+="\n	Tesoros: "+this.tesoro.toString();
        //falta

        return str;
    }

   
     public String getPosicionPirata() {
 		return posicionPirata;
 	}
     public Cofre getTesoroActual(){
    	 if(this.tesoro.get(aldeaActual.getNombre()) != null){
    		 return this.tesoro.get(aldeaActual.getNombre()).clonarCofre();
    	 }
    	 else{
    		 return null;
    	 }
     }

 	public void setPosicionPirata(String posicionPirata) {
 		this.posicionPirata = posicionPirata;
 	}
 	private String posicionPirata;
 	
 	public void ejecutarPirata(){
 		
 		ArrayList<String> a= new ArrayList<String>();
 		a.add("Ergintone");
 		a.add("Bulovoe");
 		a.add("Peregaey");
 		a.add("Aragaey");
 		a.add("Icaedur");
 		a.add("Bresol");
 		a.add("Vinizaile");
 		a.add("Mixocu");
 		a.add("Ase");
 		a.add("Cabe");
 		a.add("Cenede");
 		int randomNum =(int)(Math.random()*10); 
 		String nuevaPos = a.get(randomNum);
 		this.setPosicionPirata(nuevaPos);
 		if(!(this.tesoro.containsKey(nuevaPos))){
 		//if(!this.getTesoro().get(nuevaPos).getTesoros().isEmpty()){
 			double random = Math.random();// generamos un numero al azar entre 0 y 1 
 			
 			if(random < 0.4){
 				this.tesoro.remove(posicionPirata);
                                System.out.println("__________________________________________");
 				System.out.println("********PIRATA SAQUEA "+nuevaPos+"********");
                                System.out.println("__________________________________________");
 			}
 			
 		}
 		
 	}
}

